package main

import "fmt"

func main() {

	a, b := 1, 2
	var c int
	c = a + b
	fmt.Println("c = a + b, c =", c)
	plusAssignment(c, a)
	leftMoveAssignment(c, a)

	fmt.Println("c =", c)
	rightMoveAssignment(c, a)
	fmt.Println("c =", c)
	andAssignment(c, a)

	a1 := 4
	var ptr *int
	fmt.Println(a1)

	ptr = &a1
	fmt.Printf("*ptr 为 %d\n", *ptr)

}

func plusAssignment(c, a int) {
	c += a // c = c + a
	fmt.Println("c += a, c =", c)
}

// 左移赋值操作
// 左移位操作实际上是将原始的 c 值乘以 (2^a) 的等效操作
func leftMoveAssignment(c, a int) {
	c <<= a // c = c << a
	fmt.Println("c <<= a, c =", c)
}

// 右移赋值操作
// 右移位操作实际上是将原始的 c 值除以 (2^a) 的等效操作
func rightMoveAssignment(c, a int) {
	c >>= a // c = c >> a
	fmt.Println("c >>= a, c =", c)
}

// 二进制数的位运算
// “与”操作会返回一个新的二进制数，这个数的每一位都是两个输入数的对应位都为1时才为1，否则为0。
func andAssignment(c, a int) {
	c &= a // c = c & a
	fmt.Println("c &= a, c =", c)
}

func orAssignment(c, a int) {
	c |= a // c = c | a
	fmt.Println("c |= a, c =", c)
}

// 位运算中的异或操作
// 异或操作是位运算的一种，对于每一位进行运算：相同位异或结果为0，不同位异或结果为1。
func norAssignment(c, a int) {
	c ^= a // c = c ^ a
	fmt.Println("c ^= a, c =", c)
}
